package les

class UsuarioController {

	static allowedMethods = [save: "POST", update: "POST", delete: "POST"]

	def index = { redirect(action: "list") }

	def list = {
		if (!session.usuarioLogado) {
			redirect(uri: '/usuario/login.gsp')
			return
		}
		if (session.usuarioLogado.tipo != 'Administrador' && session.usuarioLogado.tipo != 'Jota') {
			redirect(uri: '/index.gsp')
			return
		}

		params.max = Math.min(params.max ? params.int('max') : 10, 100)
		[usuarioInstanceList: Usuario.list(params), usuarioInstanceTotal: Usuario.count()]
	}

	def create = {
		if (!session.usuarioLogado) {
			redirect(uri: '/usuario/login.gsp')
			return
		}
		if (session.usuarioLogado.tipo != 'Administrador' && session.usuarioLogado.tipo != 'Jota') {
			redirect(uri: '/index.gsp')
			return
		}

		def usuarioInstance = new Usuario()
		usuarioInstance.properties = params
		return [usuarioInstance: usuarioInstance]
	}

	def save = {
		if (!session.usuarioLogado) {
			redirect(uri: '/usuario/login.gsp')
			return
		}
		if (session.usuarioLogado.tipo != 'Administrador' && session.usuarioLogado.tipo != 'Jota') {
			redirect(uri: '/index.gsp')
			return
		}

		def usuarioInstance = new Usuario(params)
		if (params['senha'].length() < 5 || params['senha'].length() > 10) {
			usuarioInstance.errors.rejectValue('senha', '', 'A senha deve ter entre 5 e 10 caracteres.');
		}
		else {
			usuarioInstance.senha = new String(params['senha'].encodeAsMD5Hex());
		}
		if (!usuarioInstance.hasErrors() && usuarioInstance.save(flush: true)) {
			flash.message = "${message(code: 'default.created.message', args: [message(code: 'usuario.label', default: 'Usuario'), usuarioInstance.id])}"
			redirect(action: "show", id: usuarioInstance.id)
		}
		else {
			render(view: "create", model: [usuarioInstance: usuarioInstance])
		}
	}

	def show = {
		if (!session.usuarioLogado) {
			redirect(uri: '/usuario/login.gsp')
			return
		}
		if (session.usuarioLogado.tipo != 'Administrador' && session.usuarioLogado.tipo != 'Jota') {
			redirect(uri: '/index.gsp')
			return
		}

		def usuarioInstance = Usuario.get(params.id)
		if (!usuarioInstance) {
			flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])}"
			redirect(action: "list")
		}
		else {
			[usuarioInstance: usuarioInstance]
		}
	}

	def delete = {
		if (!session.usuarioLogado) {
			redirect(uri: '/usuario/login.gsp')
			return
		}
		if (session.usuarioLogado.tipo != 'Administrador' && session.usuarioLogado.tipo != 'Jota') {
			redirect(uri: '/index.gsp')
			return
		}

		def usuarioInstance = Usuario.get(params.id)
		if (usuarioInstance) {
			try {
				if (usuarioInstance.integrante != null) {
					usuarioInstance.integrante.usuario = null;
				}
				usuarioInstance.delete(flush: true)
				flash.message = "${message(code: 'default.deleted.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])}"
				redirect(action: "list")
			}
			catch (org.springframework.dao.DataIntegrityViolationException e) {
				flash.message = "${message(code: 'default.not.deleted.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])}"
				redirect(action: "show", id: params.id)
			}
		}
		else {
			flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])}"
			redirect(action: "list")
		}
	}

	def login = {
		if (session.usuarioLogado) {
			redirect(uri: '/index.gsp')
		}
	}

	def autenticar = {
		def usuario = Usuario.findWhere(email: params['email'], senha: new String(params['senha'].encodeAsMD5Hex()))
		if (usuario) {
			session.usuarioLogado = usuario
		}
		else{
			flash.message = "Informacoes incorretas."
		}
		redirect(action:"login")
	}

	def logout = {
		session.usuarioLogado = null
		redirect(action:"login")
	}

	def preparar_alterar_senha = {
		if (!session.usuarioLogado) {
			redirect(uri: '/usuario/login.gsp')
			return
		}

		def usuarioInstance = session.usuarioLogado
		if (!usuarioInstance) {
			flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])}"
			redirect(action: "list")
		}
		else {
			return [usuarioInstance: usuarioInstance]
		}
	}

	def alterar_senha = {
		if (!session.usuarioLogado) {
			redirect(uri: '/usuario/login.gsp')
			return
		}

		def usuarioInstance = Usuario.get(params.id)
		if (usuarioInstance) {
			String senhaSemCript = params['senha_nova']
			params['senha_nova'] = new String(params['senha_nova'].encodeAsMD5Hex())
			params['confirmar_senha'] = new String(params['confirmar_senha'].encodeAsMD5Hex())
			params['senha_atual'] = new String(params['senha_atual'].encodeAsMD5Hex())
			if(params['senha_nova'] == params['confirmar_senha']){
				if(params['senha_atual'] == params['senha_atual_no_banco']){
					if (params.version) {
						def version = params.version.toLong()
						if (usuarioInstance.version > version) {
							usuarioInstance.errors.rejectValue("version", "default.optimistic.locking.failure", [
								message(code: 'usuario.label', default: 'Usuario')]
							as Object[], "Another user has updated this Usuario while you were editing")
							render(view: "edit", model: [usuarioInstance: usuarioInstance])
							return
						}
					}

					if (senhaSemCript.length() < 5 || senhaSemCript.length() > 10) {
						flash.message = 'A senha deve ter entre 5 e 10 caracteres'
						redirect(action: "preparar_alterar_senha", id : params.id)
					}
					else {
						usuarioInstance.properties = params
						usuarioInstance.senha = params['senha_nova']
						if (!usuarioInstance.hasErrors() && usuarioInstance.save(flush: true)) {
							flash.message = "${message(code: 'default.updated.message', args: [message(code: 'usuario.label', default: 'Usuario'), usuarioInstance.id])}"
							redirect(uri: "/")
						}
						else {
							render(view: "preparar_alterar_senha", model: [usuarioInstance: usuarioInstance])
						}
					}
				}else{
					flash.message = "A senha atual não é válida"
					redirect(action: "preparar_alterar_senha", id : params.id)
				}
			}else{
				flash.message = "As senhas não conferem uma com a outra"
				redirect(action: "preparar_alterar_senha", id : params.id)
			}
		}
	}

	def teste_md5 = {
		params.max = Math.min(params.max ? params.int('max') : 10, 100)
		[usuarioInstanceList: Usuario.list(params), usuarioInstanceTotal: Usuario.count()]
	}
}